package main

import (
	"flag" // 导入flag包，用于解析命令行参数
	"log"  // 导入log包，用于记录日志
	"time" // 导入time包，用于设置时间相关的选项

	mail "github.com/xhit/go-simple-mail/v2" // 导入go-simple-mail包，用于发送邮件
)

func main() {
	// 通过flag.String等函数定义命令行参数
	// flag.String返回一个字符串指针
	htmlBody := flag.String("m", "", "邮件内容")
	host := flag.String("h", "", "SMTP地址")
	port := flag.Int("p", 80, "SMTP端口")
	username := flag.String("u", "", "SMTP用户名")
	password := flag.String("ps", "", "SMTP密码")
	from := flag.String("sf", "", "邮件发送者")
	addTo := flag.String("at", "", "邮件接收者")
	addCc := flag.String("ac", "", "邮件抄送者")
	subject := flag.String("ss", "", "邮件主题")
	filePath := flag.String("fp", "", "文件完整路径")
	fileName := flag.String("n", "", "文件名")

	flag.Parse() // 解析命令行参数

	// 配置SMTP服务器
	server := mail.NewSMTPClient()
	server.Host = *host                      // 设置SMTP服务器地址
	server.Port = *port                      // 设置SMTP服务器端口
	server.Username = *username              // 设置SMTP用户名
	server.Password = *password              // 设置SMTP密码
	server.KeepAlive = false                 // 设置是否保持长连接
	server.ConnectTimeout = 10 * time.Second // 设置连接超时时间
	server.SendTimeout = 10 * time.Second    // 设置发送超时时间

	// 连接到SMTP服务器
	smtpClient, err := server.Connect()
	if err != nil {
		log.Fatal(err) // 如果连接失败，则记录错误并退出
	}

	// 创建邮件消息
	email := mail.NewMSG()
	email.SetFrom(*from). // 设置发件人
				AddTo(*addTo).          // 添加收件人
				AddCc(*addCc).          // 添加抄送人
				SetSubject(*subject).   // 设置邮件主题
				SetListUnsubscribe(" ") // 设置邮件退订链接，这里为空

	// 设置邮件内容
	if *htmlBody != "" {
		email.SetBody(mail.TextHTML, *htmlBody) // 设置邮件正文，使用HTML格式
	}

	// 添加附件
	if *filePath != "" && *fileName != "" {
		email.Attach(&mail.File{FilePath: *filePath, Name: *fileName, Inline: true})
	}

	// 设置DSN（Delivery Status Notification，投递状态通知）
	email.SetDSN([]mail.DSN{mail.SUCCESS, mail.FAILURE}, false)

	// 检查构建邮件过程中是否有错误
	if email.Error != nil {
		log.Fatal(email.Error) // 如果有错误，则记录并退出
	}

	// 发送邮件
	err = email.Send(smtpClient)
	if err != nil {
		log.Println(err) // 如果发送失败，记录错误
	} else {
		log.Println("邮件已发送") // 发送成功，记录提示信息
	}
}
